package com.guida.service.impl;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.guida.dao.BookMapper;
import com.guida.domain.Book;
import com.guida.domain.Record;
import com.guida.domain.User;
import com.guida.entity.PageResult;
import com.guida.entity.Result;
import com.guida.service.BookService;
import com.guida.service.RecordService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;


@Service
@Transactional
public class BookServiceImpl implements BookService {
    //注入mapper
    @Autowired(required = false)
    private BookMapper bookMapper;

    /**
     * @param pageNum
     * @param pageSize
     * @return
     */
    @Override
    public PageResult selectNewBooks(Integer pageNum, Integer pageSize) {
        PageHelper.startPage(pageNum, pageSize);
        Page<Book> page = bookMapper.selectNewBooks();
        return new PageResult(page.getTotal(), page.getResult());
    }

    @Override
    public Book findById(String id) {
        return bookMapper.findById(id);
    }

    @Override
    public Integer borrowBook(Book book) {
        Book b = this.findById(book.getId() + "");
        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        book.setBorrowTime(dateFormat.format(new Date()));
        //将借阅的图书状态该设置为“借阅中”
        book.setStatus("1");
        book.setPrice(b.getPrice());
        book.setUploadTime(b.getUploadTime());
        return bookMapper.editBook(book);
    }


    //新增图书
    @Override
    public Integer addBook(Book book) {

        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        book.setUploadTime(dateFormat.format(new Date()));

        return bookMapper.addBook(book);
    }

    @Override
    public PageResult search(Book book, Integer pageNumber, Integer pageSize) {
        //设置分页查询的参数
        PageHelper.startPage(pageNumber,pageSize);
        Page<Book> page = bookMapper.searcherBooks(book);
        return new PageResult(page.getTotal(),page.getResult());
    }

    /**
     * 编辑图书信息
     * @param book：图书信息
     * @return
     * 定义了编辑方法，用于编辑图书信息，将编辑好的图书信息作为editBook方法的实参
     * 通过BookMapper的对象调用editBook方法，执行编辑操作，将编辑好的结果返回。
     */
    @Override
    public Integer editBook(Book book) {
        return bookMapper.editBook(book);
    }


    /**
     * 查询用户当前借阅的图书
     * @param book：封装查询条件
     * @param user：当前登录用户
     * @param pageNum：当前页码
     * @param pageSize：每页显示的数量
     * @return
     * 方法将当前登录的用户放在查询条件中，判断当前登录的用户是管理员还是普通用户
     * 如果是管理员，调用selectBorrowed方法
     */
    @Override
    public PageResult searchBorrowed(Book book, User user, Integer pageNum, Integer pageSize) {
        //设置分页查询的参数，开始分页
        PageHelper.startPage(pageNum,pageSize);
        Page<Book> page = null;
        //将当前登录的用户放入查询条件中
        book.setBorrower(user.getName());
        //如果是管理员，查询当前用户借阅但未归还的图书和所有待确认归还的图书
        if ("ADMIN".equals(user.getRole())){
            page = bookMapper.selectBorrowed(book);
        }else {
            //如果是普通用户借阅但未归还的图书
            page =  bookMapper.selectMyBorrowed(book);
        }
        return new PageResult(page.getTotal(),page.getResult());
    }

    /**
     * 归还图书
     * @param id:归还图书id
     * @param user:图书借阅者
     */
    @Override
    public boolean returnBook(String id, User user){
        Book book = this.findById(id);
        //在次校验当前登录人员和图书借阅者是否为同一个人
        boolean rb = book.getBorrower().equals(user.getName());
        //如果是同一个人，允许归还
        if (rb){
            //将图书借阅状态修改为归还中
            book.setStatus("2");
            bookMapper.editBook(book);
        }
        return rb;
    }


    @Autowired
    private RecordService recordService;

    /**
     * 归还确认，归还时新增借阅记录信息
     * @param id：待归还图书id
     */

    @Override
    public Integer returnConfirm(String id) {
        //根据图书id查询图书完整信息
        Book book = this.findById(id);
        //根据归还的图书的确认消息，设置借阅记录
        Record record = this.setRecord(book);
        //将图书的借阅状态修改为可借阅
        book.setStatus("0");
        //清除当前借阅人的信息
        book.setBorrower("");
        //清除当前图书的借阅时间
        book.setBorrowTime("");
        //清除图书的预计归还时间
        book.setReturnTime("");
        Integer count = bookMapper.editBook(book);
        //归还确认成功，新增借阅记录
        if (count == 1){
            return recordService.addRecord(record);
        }
        return 0;
    }

    /**
     * 根据图书信息设置借阅记录的信息
     * @param book：借阅图书的信息
     */
    private Record setRecord(Book book){
        Record record = new Record();
        //设置借阅记录图书的名称
        record.setBookname(book.getName());
        //设置借阅记录图书的isbn
        record.setBookisbn(book.getIsbn());
        //设置借阅记录的借阅人
        record.setBorrower(book.getBorrower());
        //设置借阅时间
        record.setBorrowTime(book.getBorrowTime());
        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        //设置图书归还确认的当天的归还时间
        record.setRemandTime(dateFormat.format(new Date()));
        return record;
    }


}
